# 自定义模型类中没有手机号这一项，所以要单独写
from rest_framework.views import APIView
from rest_framework.response import Response
# 建立django和redis联系
from django_redis import get_redis_connection
import random
from . import constants
from meiduo_mall.utils.ytx_sdk.sendSMS import CCP
from celery_tasks.sms.tasks import send_sms

class SmsAPIView(APIView):
    def get(self,request,mobile):
        """
        发送短信验证
        :param request:
        :param mobile:
        :return:
        """
        #说明：包含有效时间的设置，向redis中保存数据
        #连接redis，参数是cache中的键 短信缓存名
        redis_cli = get_redis_connection('sms')
        #1.验证60秒内是否向此手机发送过短信，如果发过则返回
        if redis_cli.get('sms_flag_'+ mobile):
            return Response({'message':'请稍候重试'})
        #2.如果未发过，则继续执行
        #2.1.随机生成6位验证码
        sms_code = random.randint(100000,999999)
        #2.2.保存验证码、发送标记
        redis_pipeline = redis_cli.pipeline()
        # pipline管道 把数据都放在管道中一次性加到redis中执行
        # redis_cli.setex('sms_' + mobile,constants.SMS_EXPIRES,sms_code)
        # redis_cli.setex('sms_flag_' + mobile,constants.SMS_FLAG_EXPIRES,1)
        redis_pipeline.setex('sms_' + mobile, constants.SMS_EXPIRES, sms_code)
        redis_pipeline.setex('sms_flag_' + mobile, constants.SMS_FLAG_EXPIRES, 1)
        #一次性将命令加到redis中执行
        redis_pipeline.execute()
        #2.3.发送
        print(sms_code)
        #  时间是分，所以/60换成分  会阻塞线程执行，所以要用celery异步
        # CCP.sendTemplateSMS(mobile,sms_code,constants.SMS_EXPIRES / 60,1)
        # 调用任务  delay 调用
        send_sms.delay(mobile,sms_code,constants.SMS_EXPIRES / 60,1)

        return Response({'message':'OK'})